home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / gnuish / ispel40s / freq.c < prev    next >
C/C++ Source or Header  |  1993-09-24  |  4KB  |  154 lines

  1. /* Copyright (C) 1990, 1993 Free Software Foundation, Inc.
  2.  
  3.    This file is part of GNU ISPELL.
  4.  
  5.    This program is free software; you can redistribute it and/or modify
  6.    it under the terms of the GNU General Public License as published by
  7.    the Free Software Foundation; either version 2, or (at your option)
  8.    any later version.
  9.  
  10.    This program is distributed in the hope that it will be useful,
  11.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.    GNU General Public License for more details.
  14.  
  15.    You should have received a copy of the GNU General Public License
  16.    along with this program; if not, write to the Free Software
  17.    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  18.  
  19. /* compute the frequencies of character pairs in a file
  20.    then write a list of characters used, plus a sorted list
  21.    of frequencies
  22.  
  23.    this program needs to run on 80286's, so it doesn't use
  24.    any individual data structure larger than 64k. */
  25.  
  26.  
  27. #ifdef __MSDOS__
  28. #undef __STDC__          /* I need not ANSI function to emulate pipes */
  29. #include <stdlib.h>
  30. #include <stdio.h>
  31. #include <io.h>                       /* access () */
  32. #include <process.h>                  /* spawnl () */
  33. /* #include "msdos.h" */
  34. #define __STDC__ 1
  35. #endif
  36.  
  37. #include <stdio.h>
  38. #include <ctype.h>
  39. #include "charset.h"
  40.  
  41. #include "ispell.h"                    /* xcalloc () */
  42.  
  43.  
  44. #include "tailor.h"
  45. #ifdef __MSDOS__
  46. #include <stdlib.h>
  47. #endif
  48.  
  49. /* this array contains letters to use when generating near misses */
  50. char near_miss_letters[256];
  51. int nnear_miss_letters;
  52.  
  53. /* this array has 1 for any character that is in near_miss_letters */
  54. char near_map[256];
  55.  
  56. long *table[256];
  57. char used[256];
  58.  
  59. int
  60. main ()
  61. {
  62.   int c1, c2;
  63.   long count;
  64.   int i, j;
  65.   FILE *out;
  66.  
  67. #ifdef NO_PIPE
  68.   char * tempfile = mktemp ( "frXXXXXX" ) ;
  69.   if ( ( out = fopen ( tempfile , "w" ) ) == NULL )
  70.     {
  71.       fprintf (stderr, "can't make temporary file to sort\n");
  72.       exit (1);
  73.     }
  74. #else
  75.   if ((out = popen ("sort -nr", "w")) == NULL)
  76.     {
  77.       fprintf (stderr, "can't make pipe to sort\n");
  78.       exit (1);
  79.     }
  80. #endif
  81.  
  82.   for (i = 0; i < 256; i++)
  83.     table[i] = (long *) xcalloc (256, sizeof (long));
  84.  
  85.   c1 = 0;
  86.   while (c1 == 0)
  87.     {
  88.       c1 = getchar ();
  89.       if (c1 == EOF)
  90.     {
  91.       fprintf (stderr, "no input\n");
  92.       exit (1);
  93.     }
  94.       c1 = charset[c1].lowercase;
  95.     }
  96.   used[c1] = 1;
  97.  
  98.   while ((c2 = getchar ()) != EOF)
  99.     {
  100.       c2 = charset[c2].lowercase;
  101.       if (c2 == 0)
  102.     continue;
  103.       used[c2] = 1;
  104.       table[c1][c2]++;
  105.       c1 = c2;
  106.     }
  107.  
  108.   /* a big "count" so this line will be at the top of the
  109.      * sorted output
  110.      */
  111.   fprintf (out, "30000 ");
  112.   for (c1 = 0; c1 < 256; c1++)
  113.     if (used[c1])
  114.       putc (c1, out);
  115.   putc ('\n', out);
  116.  
  117.   for (i = 0; i < 256; i++)
  118.     {
  119.       if (used[i] == 0)
  120.     continue;
  121.       for (j = 0; j < 256; j++)
  122.     {
  123.       if (used[j] == 0)
  124.         continue;
  125.       count = table[i][j];
  126.       if (count)
  127. #ifdef __MSDOS__        /*  no UNIX sort -n */
  128.         fprintf (out, "%5ld %c%c\n", count, i, j);
  129. #else
  130.         fprintf (out, "%ld %c%c\n", count, i, j);
  131. #endif /* __MSDOS__ */
  132.     }
  133.     }
  134.  
  135. #ifdef NO_PIPE
  136.   if ( fclose ( out ) )
  137.     {
  138.       (void) fprintf (stderr, "can't exec 'sort' program. tempfile failed \n");
  139.       exit (1);
  140.     }
  141.   out = fopen ( tempfile , "rt" ) ;
  142.   close ( 0 ) ;  /* 0 = STD_IN */ ;
  143.   dup ( fileno ( out ) ) ;
  144.   if ( spawnlp ( P_WAIT ,    "sort.exe"  , "sort.exe", "/R" , NULL ) )
  145.           perror ( "freq" ) ;
  146.   fclose ( out ) ;
  147.   unlink ( tempfile ) ;
  148. #else /* YES PIPE */
  149.   pclose (out);
  150. #endif /* PIPE */
  151.  
  152.   return 0;
  153. }
  154.